注意:所有文章除特别说明外,转载请注明出处.
简介
该模式是用于将抽象化与实现化解耦,使得二者独立变化。它通过提供抽象化与实现化之间的桥接功能,来实现两者之间的解耦。
注意:该设计模式实现抽象和实现的分离。而两个独立变化的维度使用桥接模式是最好的选择。
场景
1. 抽象和具体实现之间增加更多的灵活性
2. 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展
3. 不希望使用继承,或因为过多继承导致系统类的个数增多
优点
1. 分离抽象部分及其具体实现部分
2. 提高系统可扩展性
3. 符合开闭原则
4. 符合合成复用原则
缺点
1. 增加了系统的理解与设计难度
2. 需要正确识别系统中两个独立变化的维度
相关设计模式
1. 桥接模式与组合模式
2. 桥接模式与适配器模式
桥接模式的具体实现
1.创建桥接实现的接口
public interface DrawAPI {
public void drawCircle(int radius, int x, int y);
}
2.创建实现 DrawAPI 接口的实体桥接实现类
public class RedCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: red, radius: "
+ radius +", x: " +x+", "+ y +"]");
}
}
public class GreenCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: green, radius: "
+ radius +", x: " +x+", "+ y +"]");
}
}
3.使用 DrawAPI 接口创建抽象类 Shape
public abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI){
this.drawAPI = drawAPI;
}
public abstract void draw();
}
4.创建实现 Shape 接口的实体类
public class Circle extends Shape {
private int x, y, radius;
public Circle(int x, int y, int radius, DrawAPI drawAPI) {
super(drawAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
public void draw() {
drawAPI.drawCircle(radius,x,y);
}
}
5.使用 Shape 和 DrawAPI 类画出不同颜色的圆
public class BridgePatternDemo {
public static void main(String[] args) {
Shape redCircle = new Circle(100,100, 10, new RedCircle());
Shape greenCircle = new Circle(100,100, 10, new GreenCircle());
redCircle.draw();
greenCircle.draw();
}
}
总结
桥接模式案例中可以得到,提供两个父类:颜色和形状。颜色父类和形状父类都包含相应的子类,然后根据需要对颜色和形状进行组合。
桥接模式是将抽象部分和它的实现部分抽离开来,使得它们可以独立变化。
1.抽象化:将复杂的物体的一个或者几个特性抽离出去而只注意其它特性的行动和过程。在面向对象中就是将对象的共同性质抽取出去形成类的过程。
2.实现化:针对类给出的具体实现。
3.脱耦:将抽象化和实现化之间的耦合解脱开,或者是将它们之间的强关联改成弱关联,将两个角色之间的关系从继承改成关联关系。
桥接模式的应用场景
1.如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2.对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3.一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。